package com.zenithmind.common.config;

import java.util.Map;
import java.util.Optional;

/**
 * 配置服务接口
 * 遵循依赖倒置原则：依赖抽象而非具体实现
 * 遵循接口隔离原则：只包含配置管理相关的操作
 */
public interface ConfigurationService {
    
    /**
     * 获取配置值
     * 
     * @param key 配置键
     * @return 配置值
     */
    Optional<String> getConfig(String key);
    
    /**
     * 获取配置值（带默认值）
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    String getConfig(String key, String defaultValue);
    
    /**
     * 获取整型配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    int getIntConfig(String key, int defaultValue);
    
    /**
     * 获取长整型配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    long getLongConfig(String key, long defaultValue);
    
    /**
     * 获取布尔型配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    boolean getBooleanConfig(String key, boolean defaultValue);
    
    /**
     * 获取双精度配置值
     * 
     * @param key 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    double getDoubleConfig(String key, double defaultValue);
    
    /**
     * 设置配置值
     * 
     * @param key 配置键
     * @param value 配置值
     * @return 是否设置成功
     */
    boolean setConfig(String key, String value);
    
    /**
     * 删除配置
     * 
     * @param key 配置键
     * @return 是否删除成功
     */
    boolean removeConfig(String key);
    
    /**
     * 获取所有配置
     * 
     * @return 配置映射
     */
    Map<String, String> getAllConfigs();
    
    /**
     * 获取指定前缀的配置
     * 
     * @param prefix 前缀
     * @return 配置映射
     */
    Map<String, String> getConfigsByPrefix(String prefix);
    
    /**
     * 批量设置配置
     * 
     * @param configs 配置映射
     * @return 设置结果
     */
    BatchConfigResult setConfigs(Map<String, String> configs);
    
    /**
     * 刷新配置
     * 
     * @return 是否刷新成功
     */
    boolean refreshConfigs();
    
    /**
     * 监听配置变化
     * 
     * @param key 配置键
     * @param listener 变化监听器
     */
    void addConfigListener(String key, ConfigChangeListener listener);
    
    /**
     * 移除配置监听器
     * 
     * @param key 配置键
     * @param listener 变化监听器
     */
    void removeConfigListener(String key, ConfigChangeListener listener);
    
    /**
     * 配置变化监听器
     */
    interface ConfigChangeListener {
        /**
         * 配置变化回调
         * 
         * @param key 配置键
         * @param oldValue 旧值
         * @param newValue 新值
         */
        void onConfigChanged(String key, String oldValue, String newValue);
    }
    
    /**
     * 批量配置结果
     */
    class BatchConfigResult {
        private int successCount;
        private int failureCount;
        private java.util.List<String> failedKeys;
        
        public BatchConfigResult(int successCount, int failureCount, java.util.List<String> failedKeys) {
            this.successCount = successCount;
            this.failureCount = failureCount;
            this.failedKeys = failedKeys;
        }
        
        // Getters
        public int getSuccessCount() { return successCount; }
        public int getFailureCount() { return failureCount; }
        public java.util.List<String> getFailedKeys() { return failedKeys; }
    }
}
